﻿using System;

namespace FacadePattern;

//外观模式

/// <summary>
/// 以学生选课系统为例子演示外观模式的使用
/// 学生选课模块包括功能有：
/// 验证选课的人数是否已满
/// 通知用户课程选择成功与否
/// 客户端代码
/// </summary>
public static class Program
{
    private static readonly RegistrationFacade Facade = new();

    private static void Main()
    {
        Console.WriteLine(Facade.RegisterCourse("设计模式", "张三") ? "选课成功" : "选课失败");
    }
}

// 外观类
public class RegistrationFacade
{
    private readonly RegisterCourse _registerCourse = new();
    private readonly NotifyStudent _notifyStu = new();

    public bool RegisterCourse(string courseName, string studentName)
    {
        return _registerCourse.CheckAvailable(courseName) && _notifyStu.Notify(studentName);
    }
}

// 相当于子系统A
public class RegisterCourse
{
    public bool CheckAvailable(string courseName)
    {
        Console.WriteLine("正在验证课程 {0}是否人数已满", courseName);
        return true;
    }
}

// 相当于子系统B
public class NotifyStudent
{
    public bool Notify(string studentName)
    {
        Console.WriteLine("正在向{0}发生通知", studentName);
        return true;
    }
}